package socket;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

/**
 * Created by zhour on 2016/9/1.
 */
public class Server {
    public static final int PORT = 12345;
    public static ConcurrentMap<String, Socket> socketMap = new ConcurrentHashMap<>();
    public static void main(String[] args) {
        System.out.println("服务器启动...\n");
        Server server = new Server();
        server.init();
    }

    public void init() {
        try {
            ServerSocket serverSocket = new ServerSocket(PORT);
            while (true) {
                // 一旦有堵塞, 则表示服务器与客户端获得了连接
                Socket client = serverSocket.accept();
                // 处理这次连接
                new HandlerThread(client);
            }

        } catch (Exception e) {
            System.out.println("服务器异常: " + e.getMessage());
        }
    }

    private class HandlerThread implements Runnable {
        private Socket socket;
        private int sockeKey;
        public HandlerThread(Socket client) {
            socket = client;
            new Thread(this).start();
        }

        public void run() {
                    try {
                    // 读取客户端数据
                        DataInputStream input = new DataInputStream(socket.getInputStream());
                        //向客户端回复信息
                        DataOutputStream out = new DataOutputStream(socket.getOutputStream());

                        String clientInputStr = input.readUTF();//这里要注意和客户端输出流的写方法对应,否则会抛 EOFException
                        // 处理客户端数据
                        System.out.println("客户端发过来的内容:" + clientInputStr);

                        if (clientInputStr != null && !"".equals(clientInputStr)){
                            if (clientInputStr.contains("id")) {
                                String[] keyArray = clientInputStr.split(":");
                                String key = keyArray[1];
                                sockeKey = Integer.parseInt(key);
                                socketMap.put(key,socket);
                                out.writeUTF("accept");
                            }
                            clientInputStr = input.readUTF();//这里要注意和客户端输出流的写方法对应,否则会抛 EOFException
                            if (sockeKey == 1) {
                                Socket toSentSocket = socketMap.get(clientInputStr);
                                if (toSentSocket != null){
                                    System.out.println(toSentSocket.toString());
                                    // 向客户端回复信息
                                    DataOutputStream out2 = new DataOutputStream(toSentSocket.getOutputStream());
                                    // 发送键盘输入的一行
                                    String s = "message from client1. message is "+ clientInputStr;
                                    out2.writeUTF(s);
                                    out2.close();
                                }
                                 // 发送键盘输入的一行
                                String s = "socket";
                                out.writeUTF(s);
                                out.close();
                                input.close();
                            }else {
                                //message
                                // 发送键盘输入的一行
                                String s = "socket";
                                out.writeUTF(s);
                                Thread.sleep(20000);
                            }
                        }

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
//                        e.printStackTrace();
                    }finally {
                    if (socket != null) {
                        try {
                            socket.close();
                        } catch (Exception e) {
                            socket = null;
                            System.out.println("服务端 finally 异常:" + e.getMessage());
                        }
                    }
                }
            }

    }
}
